<?php

namespace app\common\business\user;

use \think\Request;
use \think\Session;
use app\common\mysql\Users as userMysql;
use app\common\business\user\Point as pointBn;
use app\common\business\Coupon as couponBn;
use app\common\business\Cz as czBn;
use think\Config as Configbn;
use app\common\business\User as userBn;
use app\common\business\Match as matchBn;
class Hd extends \app\common\business\AbstractModel {


    /*
 * 经典的概率算法，
 * $proArr是一个预先设置的数组，
 * 假设数组为：array(100,200,300，400)，
 * 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内，
 * 如果不在，则将概率空间，也就是k的值减去刚刚的那个数字的概率空间，
 * 在本例当中就是减去100，也就是说第二个数是在1，900这个范围内筛选的。
 * 这样 筛选到最终，总会有一个数满足要求。
 * 就相当于去一个箱子里摸东西，
 * 第一个不是，第二个不是，第三个还不是，那最后一个一定是。
 * 这个算法简单，而且效率非常 高，
 * 关键是这个算法已在我们以前的项目中有应用，尤其是大数据量的项目中效率非常棒。
 */
    public static function get_rand($params) {
        /*
        * 奖项数组
        * 是一个二维数组，记录了所有本次抽奖的奖项信息，
        * 其中id表示中奖等级，prize表示奖品，v表示中奖概率。
        * 注意其中的v必须为整数，你可以将对应的 奖项的v设置成0，即意味着该奖项抽中的几率是0，
        * 数组中v的总和（基数），基数越大越能体现概率的准确性。
        * 本例中v的总和为100，那么平板电脑对应的 中奖概率就是1%，
        * 如果v的总和是10000，那中奖概率就是万分之一了。
        *
        */
        //判断是否什么类型的活动
        $typeinfo=userMysql::name('activity_type')
            ->where('type_id='.$params['type_id'])
            ->find();
        if($typeinfo['is_delete']){
            exception('抽奖活动未开启', 110040);
        }

        $r6=true;
        $times=1;
//        if($typeinfo['is_usepoint']){
//            $point=userMysql::name('users')
//                ->where('user_id='.$params['user_id'])
//                ->value('point');
//
//            //查询今天玩的次数
//            $logcount=userMysql::name('activity_log')
//                ->alias('l')
//                ->whereTime('add_time', 'today')
//                ->join('jc_activity_prize p','p.prize_id = l.prize_id')
//                ->where('user_id='.$params['user_id'].' and parent_id!=3 and l.type=4')
//                ->count('log_id');
//            if(self::getwebAppVersion()<=342){
//                if($logcount>$typeinfo['free_time']){
//                    if($point<$typeinfo['points']){
//                        exception('嗨豆不足', 110040);
//                    }
//                    $post['user_id']=$params['user_id'];
//                    $post['point']=$typeinfo['points'];
//                    $post['source_type']=0;
//                    $post['change_type']=2;
//                    $post['point_type']=4;
//                    $post['change_memo']=$typeinfo['type_name'].'消耗';
//                    $r6=pointBn::updatePoint($post);
//                }
//            }else{
////            if($logcount>$typeinfo['free_time']){
//                if($params['type']!=4){
//                    switch($params['type']){
//                        case 2:
//                            $times=5;
//                            $typeinfo['points']=110;
//                            break;
//                        case 3:
//                            $times=10;
//                            $typeinfo['points']=205;
//                            break;
//                        default:
//                            $times=1;
//                            $typeinfo['points']=$typeinfo['points'];
//                    }
//                    if($point<$typeinfo['points']){
//                        exception('嗨豆不足', 110040);
//                    }
//                    $post['user_id']=$params['user_id'];
//                    $post['point']=$typeinfo['points'];
//                    $post['source_type']=0;
//                    $post['change_type']=2;
//                    $post['point_type']=4;
//                    $post['change_memo']=$typeinfo['type_name'].'消耗';
//
//                    $r6=pointBn::updatePoint($post);
//                }else{
//                    if($logcount>1){
//                        exception('无免费次数了', 110040);
//                    }
//                    $times=3;
//                }
//            }
////            }
//        }
        //查询今天玩的次数
        $logcount=userMysql::name('activity_log')
            ->alias('l')
            ->join('clt_activity_prize p','p.prize_id = l.prize_id')
            ->where('user_id='.$params['user_id'].' and parent_id!=3 and type_id='.$typeinfo['type_id'])
            ->count('log_id');
        if($typeinfo['type_id']==1){
            if($logcount>=1){
                exception('您已经参与过抽奖', 110040);
            }
        }else{
            $post['user_id']=$params['user_id'];
            $logcount=userMysql::name('activity_log')
                ->alias('l')
                ->whereTime('add_time','today')
                ->join('clt_activity_prize p','p.prize_id = l.prize_id')
                ->where('user_id='.$params['user_id'].' and parent_id!=3 and type_id='.$typeinfo['type_id'])
                ->count('log_id');
            if($logcount>=1){
                exception('今日抽奖次数0次！', 110040);
            }
            if(!matchBn::checktodyguess($post)){
                exception('今日抽奖次数0次！', 110040);
            }
        }

        $prize_arr=userMysql::name('activity_prize')
            ->where('is_delete=0 and type_id='.$typeinfo['type_id'])
            ->select();
        $arr=array();
        foreach ($prize_arr as $key => $val) {
            $prize_array[$val['prize_id']]=$val;
            $arr[$val['prize_id']] = $val['probability'];
        }
        $result = '';
        //概率数组的总概率精度
        for($x=0; $x<$times; $x++) {
            $proSum = array_sum($arr);
            //概率数组循环
            foreach ($arr as $key => $proCur) {
                $randNum = mt_rand(1, $proSum);
                if ($randNum <= $proCur) {
                    $result = $key;
                    break;
                } else {
                    $proSum -= $proCur;
                }
            }

            //如果抽到的奖品超过今天的限额则跳到默认的谢谢参与
            if($prize_array[$result]['parent_id']!=4&&$prize_array[$result]['parent_id']!=3){

                $limituser=userMysql::name('activity_log')
                    ->alias('l')
                    ->whereTime('add_time', 'today')
                    ->join('clt_activity_prize p','p.prize_id = l.prize_id')
                    ->where('user_id='.$params['user_id'].' and p.prize_id='.$result)
                    ->count('log_id');

                if(($prize_array[$result]['limitnum']!=-1&&$prize_array[$result]['limitnum']<=0)||($prize_array[$result]['user_limitnum']!=0&&$prize_array[$result]['user_limitnum']<=$limituser)){
                    $result=userMysql::name('activity_prize')
                        ->where('is_delete=0 and parent_id=4 and type_id='.$params['type_id'])
                        ->value('prize_id');
                    //如果没有设定谢谢参与的项 则跳出
                    if(empty($result)){
                        exception('谢谢参与', 110040);
                    }
                }
            }
            $update['prize_id']=$result;
            $update['user_id'] =$params['user_id'];
            $update['add_time']=time();
            userMysql::startTrans();
            //获取插入数据库的id
            $r = userMysql::name('activity_log')->insertGetId($update);

            $r1=$r3=$r4=$r5=true;
            if(!$r){
                exception('业务处理错误，请联系管理员', 100003);
            }
            //谢谢参与与重玩一次不限次数，所以不扣减次数值

            if($prize_array[$result]['parent_id']!=4&&$prize_array[$result]['parent_id']!=3){
                $r1 = userMysql::name('activity_prize')
                    ->where(array('prize_id' => $result))->setDec('limitnum', 1);
            }
            if($prize_array[$result]['parent_id']==2){
                $post['user_id']=$params['user_id'];
                $post['point']=explode('积',$prize_array[$result]['prize'])[0];
                $post['source_type']=0;
                $post['change_type']=1;
                $post['point_type']=4;
                $post['change_memo']=$typeinfo['type_name'].'得积分';
                $r4=pointBn::updatePoint($post);
                //获得金币
            }
            //抽到积分类的要做相应的加积分
            //获得积分
            if($prize_array[$result]['parent_id']==2||$prize_array[$result]['parent_id']==5||$prize_array[$result]['parent_id']==6){
                if($r4){
                    $r5=userMysql::name('activity_log')
                        ->where('log_id='.$r)
                        ->update(['is_delete' => 1]);
                }
            }
            /*
             *
             * 扣除积分
             *
             * */

    //        }
            if($r1!=true||$r3!=true||$r4!=true||$r5!=true||$r6!=true){
                userMysql::rollback();
                if($r1!=true||$r3!=true||$r4!=true||$r5!=true||$r6!=true){
                    exception('业务处理错误，请联系管理员', 100003);
                }
            } else{

                userMysql::commit();
            }
            $return['parent_id']     =$prize_array[$result]['parent_id'];
            $return['prize']         =$prize_array[$result]['prize'];
            $return['prize_id'] =$result;
            $return['end_time'] =time()+7*86400;
        }
        return $return;
    }
    /*
     * 大转盘全部奖项
     *
     * */
    public static function prizetotal($params){
        return $prize_arr=userMysql::name('activity_prize')
            ->field('prize_id,prize,img_url,prize_size,header_img,parent_id')
            ->where('is_delete=0 and type_id='.$params['type_id'])
            ->select();
    }
    /*
    *服务器时间+抽奖信息
    *
    * */
    public static function randprizeInfo($params){

         $typeinfo=userMysql::name('activity_type')
            ->field('type_id,type_name,is_delete')
            ->where('type_id='.$params['type_id'])
            ->find();
         $typeinfo['server_time']=time();

        return $typeinfo;
    }
    /*
    * 大转盘跑马灯
    *
    * */
    public static function runninglight($params){
        $prize_arr=userMysql::name('activity_log')
            ->alias('a')
            ->field('p.prize,u.nickname')
            ->join('clt_activity_prize p','p.prize_id=a.prize_id','left')
            ->join('clt_users u','u.user_id=a.user_id','left')
            ->where('p.parent_id not in (3,4)')
            ->where('a.is_delete in(0,1) and p.type_id='.$params['type_id'])
            ->where('a.add_time<='.time())
            ->select();
        return $prize_arr;
    }
    /*
   * 用户获奖表
   *
   * */
    public static function userprize($params){
        self::_checkPageAndCount($params);
        $prize_arr=userMysql::name('activity_log')
            ->alias('a')
            ->where('a.user_id='.$params['user_id'])
            ->where('a.is_delete=0')
            ->whereTime('a.add_time','-7 days')
            ->field('p.prize,u.nickname,a.add_time,p.header_img,p.img_url,p.prize_id,p.parent_id')
            ->join('clt_activity_prize p','p.prize_id=a.prize_id','left')
            ->join('clt_users u','u.user_id=a.user_id','left')
            ->join('clt_activity_type t','t.type_id=p.type_id','left')
            ->where('p.parent_id not in (3,4) and t.type_id='.$params['type_id'])
            ->select();
        foreach($prize_arr as $key=>$val){
            $prize_arr[$key]['end_time']=$val['add_time']+7*86400;
        }
        return $prize_arr;
    }
    /*
     * 统计一场比赛的数据
     *
    * */
    public static function prizesum($params){
        self::_checkPageAndCount($params);
        $prize_arr=userMysql::name('activity_log')
            ->alias('a')
            ->where('a.user_id='.$params['user_id'])
            ->whereTime('a.add_time', 'today')
            ->join('jc_activity_prize p','p.prize_id=a.prize_id','left')
            ->join('jc_activity_type t','t.type_id=p.type_id','left')
            ->where('p.parent_id not in (3,4) and t.type_id='.$params['type_id'])
            ->select();
        $return['point']=0;
        $return['money']=0;
        $return['coupon']=0;
        foreach($prize_arr as $key=>$val){
            switch($val['parent_id']){
                case 2:
                    $return['point']=$return['point']+explode('嗨',$val['prize'])[0];
                    break;
                case 5:
                    $return['money']=$return['money']+explode('金',$val['prize'])[0];
                    break;
                case 6:
                    $return['coupon']++;
                    break;
                default:
                    break;
            }
        }
        if($return['point']==0&&$return['money']==0&&$return['coupon']==0){
            $update['prize_id']=12;
            $update['user_id'] =$params['user_id'];
            $update['add_time']=time();
            //获取插入数据库的id
            $r = userMysql::name('activity_log')->insertGetId($update);
        }
        return $return;
    }
    /**
     * 获取where条件
     *
     * @param array $params
     * @return array
     */
    protected static function _getWhere($params) {
        $where = array();
        if (isset($params["user_id"]) && !empty($params["user_id"])) {
            $where['user_id'] = $params["user_id"];
        }
        if (isset($params['nickname']) && !empty($params['nickname'])) {
            $where['nickname'] = ['like', '%' . $params['nickname'] . '%'];
        }
        if (isset($params['cat_id']) && !empty($params['cat_id'])) {
            $where['cat_id'] = $params['cat_id'];
        }
        if (isset($params['country_type']) && !empty($params['country_type'])) {
            $where['country_type'] = $params['country_type'];
        }
        if (isset($params['is_search']) && !empty($params['is_search'])) {
            $where['is_search'] = $params['is_search'];
        }
        if (isset($params['is_delete'])) {
            $where['l.is_delete'] = $params['is_delete'];
        }
        if (isset($params['away_id']) && !empty($params['away_id'])) {
            $where['id'] = ['in', $params['away_id'] . ',' . $params['home_id']];
        }
        if (isset($params['id']) && !empty($params['id'])) {
            $where['id'] = $params['id'];
        }
        if (isset($params['type_id']) && !empty($params['type_id'])) {
            $where['type_id'] = $params['type_id'];
        }
        return $where;
    }

    /*
     * 查询用户当天玩的次数
     *
     * */
    public static function isfirsttime($params){
        //查询今天玩的次数
        $date['logcount']=userMysql::name('activity_log')
            ->alias('l')
            ->whereTime('add_time', 'today')
            ->join('clt_activity_prize p', 'p.prize_id=l.prize_id', 'left')
            ->join('clt_activity_type t', 't.type_id=p.type_id', 'left')
            ->where('user_id='.$params['user_id'].' and t.type_id='.$params['type_id'])
            ->count('log_id');
//        $date['free_time']=userMysql::name('activity_type')
//            ->where('type_id='.$params['type_id'])
//            ->value('free_time');
        $date['server_time']=time();
        return $date;
    }
    /**
     * 抽奖列表
     *
     * */
    public static function prizeindex($params)
    {
        self::_checkPageAndCount($params);
        $where = self::_getWhere($params);
        $params['query'] = self::_getQuery($params);
        $listdata = userMysql::name('activity_log')
            ->alias('l')
            ->where($where)
            ->field('u.user_id,u.nickname,u.headimgurl,l.is_delete,l.log_id,p.prize,l.add_time')
            ->where('p.parent_id in(1,2)')
            ->join('jc_activity_prize p', 'p.prize_id=l.prize_id', 'left')
            ->join('jc_users u', 'u.user_id=l.user_id', 'left')
            ->order("l.log_id DESC")
            ->paginate(array("list_rows" => $params['count'], 'p' => $params['page'], 'query' => $params['query']));
        if (!empty($listdata)) {
//            $listdata = self::_adapterList($listdata);
        }
        return $listdata;
    }

    /**
     * 抽奖列表
     *
     * */
    public static function prize($params)
    {
        self::_checkPageAndCount($params);
        $where = self::_getWhere($params);
        $params['query'] = self::_getQuery($params);
        $listdata = userMysql::name('activity_prize')
            ->alias('l')
            ->where($where)
            ->order('prize_id desc')
            ->paginate(array("list_rows" => $params['count'], 'p' => $params['page'], 'query' => $params['query']));
        if (!empty($listdata)) {
            $listdata = self::_adapterList($listdata);
        }
        return $listdata;
    }
    /**
     * 抽奖列表
     *
     * */
    public static function prizetype($params)
    {
        self::_checkPageAndCount($params);
        $where = self::_getWhere($params);
        $params['query'] = self::_getQuery($params);
        $listdata = userMysql::name('activity_type')
            ->where($where)
            ->paginate(array("list_rows" => $params['count'], 'p' => $params['page'], 'query' => $params['query']));
        if (!empty($listdata)) {
//            $listdata = self::_adapterList($listdata);
        }
        return $listdata;
    }
    /**
     * 获取Query条件
     *
     * @param array $params
     * @return array
     */
    protected static function _getQuery($params)
    {
        $query = array();
        if (isset($params['nickname'])) {
            $query['nickname'] = $params['nickname'];
        }
        if (isset($params['is_delete'])) {
            $query['is_delete'] = $params['is_delete'];
        }
        if (isset($params['type_id'])) {
            $query['type_id'] = $params['type_id'];
        }
        return $query;
    }

    /**
     * 适配输出
     *
     * @params
     * @return array
     */
    protected static function _adapterList($listdata)
    {
        foreach ($listdata as $k => $v) {
            switch($v['parent_id']){
                case 1:
                    $listdata[$k]['parent_id'] = '礼品类';
                    break;
                case 2:
                    $listdata[$k]['parent_id'] = '积分类';
                    break;
                case 3:
                    $listdata[$k]['parent_id'] ='再玩一次';
                    break;
                case 5:
                    $listdata[$k]['parent_id'] = '金币';
                    break;
                case 4:
                    $listdata[$k]['parent_id'] = '谢谢参与';
                    break;
                default:
                    $listdata[$k]['parent_id'] = '优惠劵';
            }

        }

        return $listdata;
    }


    /**
     * 修改信息
     *
     * */
    public static function edit($post = array())
    {
        $params = $post;
        unset($params['id']);
        return $data = userMysql::name('activity_log')
            ->where('log_id=' . $post['id'])
            ->update($params);
    }
    /**
     * 修改信息
     *
     * */
    public static function recycle($post = array())
    {
        $params = $post;
        unset($params['id']);
        return $data = userMysql::name('activity_log')
            ->where('log_id=' . $post['id'])
            ->delete();
    }
    /**
     * 修改信息
     *
     * */
    public static function info($id)
    {

        return $data = userMysql::name('activity_prize')
            ->where('prize_id=' . $id)
            ->find();
    }
    /**
     * 修改信息
     *
     * */
    public static function typeedit($post)
    {
        unset($post['$params']);
        $params=$post;
        return $data = userMysql::name('activity_type')
            ->where('type_id=' . $post['type_id'])
            ->update($params);
    }
    /**
     * 修改信息
     *
     * */
    public static function typeinfo($id)
    {

        return $data = userMysql::name('activity_type')
            ->where('type_id=' . $id)
            ->find();
    }
    /**
     * 修改信息
     *
     * */
    public static function typeinfos()
    {

        return $data = userMysql::name('activity_type')
            ->where('is_delete=0')
            ->select();
    }
    /**
     * 修改信息
     *
     * */
    public static function save($post = array(),$id)
    {
        if($id){
            return $data = userMysql::name('activity_type')
                ->where('type_id=' . $id)
                ->update($post);
        }else{
            return $data = userMysql::name('activity_type')
                ->insert($post);
        }
    }
    /**
     * 修改信息
     *
     * */
    public static function prizesave($post = array(),$id)
    {
        if($id){
            return $data = userMysql::name('activity_prize')
                ->where('prize_id=' . $id)
                ->update($post);
        }else{
            return $data = userMysql::name('activity_prize')
                ->insert($post);
        }
    }
    /**
     * 添加
     *
     * */
    public static function prizeadd($post = array())
    {
        return $data = userMysql::name('activity_prize')
            ->insert($post);

    }

    /**
     * 添加
     *
     * */
    public static function addhd($post = array())
    {
        $post['add_time'] = strtotime($post['add_time']);
        if (empty($post['user_id'])) {
            $userinfo = userMysql::query('SELECT user_id FROM `quiz_user` where user_id>=1000 and user_id<=7000 ORDER BY RAND() limit 1');
            $post['user_id'] = $userinfo[0]['user_id'];
        } else {
            $post['user_id'] = $post['user_id'];
        }
        return $data = userMysql::name('activity_log')
            ->insert($post);

    }
}

